package com.workhours.service;

import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.workhours.dto.LoginRequest;
import com.workhours.entity.User;
import com.workhours.mapper.UserMapper;
import com.workhours.vo.LoginResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 认证服务类
 *
 * @author WorkHours
 * @since 2025-09-19
 */
@Service
public class AuthService {
    
    private static final Logger log = LoggerFactory.getLogger(AuthService.class);
    
    @Autowired
    private UserMapper userMapper;
    
    /**
     * 用户登录（不存在则自动创建）
     *
     * @param loginRequest 登录请求
     * @return 登录响应
     */
    public LoginResponse login(LoginRequest loginRequest) {
        String token = loginRequest.getToken();
        log.info("用户尝试登录，token: {}", token);
        
        // 查询用户是否存在
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("token", token);
        User user = userMapper.selectOne(queryWrapper);
        
        boolean isNewUser = false;
        
        // 如果用户不存在，自动创建
        if (user == null) {
            log.info("用户不存在，自动创建新用户，token: {}", token);
            user = new User(token);
            userMapper.insert(user);
            isNewUser = true;
        } else {
            log.info("用户已存在，直接登录，userId: {}", user.getId());
        }
        
        // 使用SaToken进行登录
        StpUtil.login(user.getId());
        String saToken = StpUtil.getTokenValue();
        
        log.info("用户登录成功，userId: {}, saToken: {}", user.getId(), saToken);
        
        return new LoginResponse(user.getId(), token, saToken, isNewUser);
    }
    
    /**
     * 用户登出
     */
    public void logout() {
        Long userId = StpUtil.getLoginIdAsLong();
        log.info("用户登出，userId: {}", userId);
        StpUtil.logout();
    }
    
    /**
     * 获取当前登录用户ID
     *
     * @return 用户ID
     */
    public Long getCurrentUserId() {
        return StpUtil.getLoginIdAsLong();
    }
    
    /**
     * 检查用户是否已登录
     *
     * @return 是否已登录
     */
    public boolean isLogin() {
        return StpUtil.isLogin();
    }
}
